package baja;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Scanner;

public class Baja {
	
	Calendar inicio;
	Integer komiketo1;
	Integer komiketo2;
	Integer numEquipes;
	List<Equipe> equipes;
	
	public Baja(){
		inicio = new GregorianCalendar();
		try{
			File in = new File("Equipes.txt");
			InputStream fileLeitura = new  FileInputStream(in);
			InputStreamReader wLeitura = new InputStreamReader(fileLeitura);  
			BufferedReader bufLeitura = new BufferedReader(wLeitura);

			String linha = bufLeitura.readLine();
			linha = linha.trim();
			numEquipes = Integer.parseInt(linha);
			linha = bufLeitura.readLine();
			linha = linha.trim();
			String s[] = linha.split("\\t");
			komiketo1 = Integer.parseInt(s[0]);
			komiketo2 = Integer.parseInt(s[1]);
			this.equipes = new ArrayList<Equipe>();
			Equipe equipe;
			linha = bufLeitura.readLine();
			while(linha!= null) {
				linha = linha.trim();
				s = linha.split("\\t");
				equipe = new Equipe(Integer.parseInt(s[0]), s[1]);
				this.equipes.add(equipe);
				linha = bufLeitura.readLine();
			}
			
			bufLeitura.close();
			wLeitura.close();
			fileLeitura.close();
		}
		catch(IOException e){
			System.out.println("Erro: Arquivo nao encontrado!" +
					"Voce deve criar o arquivo 'Equipes.txt'");
		}
	}
	public void exec(){
		Scanner scan = new Scanner(System.in);
		int menu = 0;
		for (Equipe equipe : equipes) {
			equipe.start();
		}
		String leitura = null;
		do {
			Collections.sort(equipes);
			Calendar tempoEnduro = new GregorianCalendar();
			tempoEnduro.add(Calendar.HOUR_OF_DAY, -inicio.get(Calendar.HOUR_OF_DAY));
			tempoEnduro.add(Calendar.MINUTE, -inicio.get(Calendar.MINUTE));
			tempoEnduro.add(Calendar.SECOND, -inicio.get(Calendar.SECOND));
			System.out.println("Tempo do Enduro: "
					+ tempoEnduro.get(Calendar.HOUR_OF_DAY) + ":"
					+ tempoEnduro.get(Calendar.MINUTE) + ":"
					+ tempoEnduro.get(Calendar.SECOND));
			System.out.println("Classificacao:");
			System.out.println("Posicao\tVoltas\tNumero\tEquipe\t\t\t\t\t   Ultima Volta");
			for (int i = 0; (i < numEquipes-2 && i < this.equipes.size()); i++) {
				System.out.println(i+1 + "\t" + this.equipes.get(i));
			}
			Integer id1 = this.equipes.lastIndexOf(new Equipe(komiketo1, ""));
			Integer id2 = this.equipes.lastIndexOf(new Equipe(komiketo2, ""));
			if (this.equipes.size() > numEquipes){
				if (id1 > numEquipes-2){
					if (id2 > numEquipes-2){
						if (id1 < id2) {
							System.out.println(id1+1 + "\t" + this.equipes.get(id1));
							System.out.println(id2+1 + "\t" + this.equipes.get(id2));
						} else {
							System.out.println(id2+1 + "\t" + this.equipes.get(id2));
							System.out.println(id1+1 + "\t" + this.equipes.get(id1));
						}
					} else {
						System.out.println(numEquipes-1 + "\t" + this.equipes.get(numEquipes-2));
						System.out.println(id1+1 + "\t" + this.equipes.get(id1));
					}
				} else if (id2 > numEquipes-2) {
					System.out.println(numEquipes-1 + "\t" + this.equipes.get(numEquipes-2));
					System.out.println(id2+1 + "\t" + this.equipes.get(id2));
				} else {
					System.out.println(numEquipes-1 + "\t" + this.equipes.get(numEquipes-2));
					System.out.println(numEquipes + "\t" + this.equipes.get(numEquipes-1));
				}
			}
			System.out.print("(Para sair digite Q) Inserir nova volta para a equipe: ");
			try {
				leitura = scan.nextLine();
				menu = Integer.parseInt(leitura);
				for (int i = 0; i < 40; i++) {
					System.out.println();
				}
				int id = equipes.lastIndexOf(new Equipe(menu, ""));
				if (id > -1) {
					equipes.get(id).add();
					System.out.println("Volta lancada para equipe " + menu);
				} else {
					System.out.println("Equipe " + menu + " nao cadastrada!");
				}
			} catch (NumberFormatException nfe){
				for (int i = 0; i < 40; i++) {
					System.out.println();
				}
				if (!leitura.equals("q") && !leitura.equals("Q")) {
					System.out.println("Digite o NUMERO da equipe!");
				}
			}
		} while (!leitura.equals("q") && !leitura.equals("Q"));
		scan.close();
		for (int i = 0; i < 40; i++) {
			System.out.println();
		}
		System.out.println("Classificacao:");
		for (int i = 0; i < this.equipes.size(); i++) {
			System.out.println(i + "\t" + this.equipes.get(i));
		}
		System.out.print("Fim do Enduro! ");
		if (this.equipes.lastIndexOf(new Equipe(komiketo1, "")) == 0) {
			System.out.print("Parabens equipe " + this.equipes.get(
					this.equipes.lastIndexOf(new Equipe(komiketo1, ""))).getNome()
					+ "!");
		}
		if (this.equipes.lastIndexOf(new Equipe(komiketo2, "")) == 0) {
			System.out.print("Parabens equipe " + this.equipes.get(
					this.equipes.lastIndexOf(new Equipe(komiketo2, ""))).getNome()
					+ "!");
		}
		System.out.println();
		Calendar tempoEnduro = new GregorianCalendar();
		tempoEnduro.add(Calendar.HOUR_OF_DAY, -inicio.get(Calendar.HOUR_OF_DAY));
		tempoEnduro.add(Calendar.MINUTE, -inicio.get(Calendar.MINUTE));
		tempoEnduro.add(Calendar.SECOND, -inicio.get(Calendar.SECOND));
		System.out.print("Tempo total: "
				+ tempoEnduro.get(Calendar.HOUR_OF_DAY) + ":");
		if (tempoEnduro.get(Calendar.MINUTE) < 10) {
			System.out.print(0);
		}
		System.out.print(tempoEnduro.get(Calendar.MINUTE) + ":");
		if (tempoEnduro.get(Calendar.SECOND) < 10) {
			System.out.print(0);
		}
		System.out.println(tempoEnduro.get(Calendar.SECOND) +
				" Confira o resultado final logo acima!");
		File dir = new File("Voltas");
		dir.mkdirs();
		for (Equipe equipe : equipes) {
			equipe.escreverRegistro();
		}
		System.out.println("Foram gerados os arquivos com os "
			+ "tempos das voltas de cada equipe.\nEles estao na pasta Voltas.");
	}
	
	public static void main(String[] args) {
		Baja b = new Baja();
		b.exec();
	}

}
